package besteAukera;

import java.awt.Color;
import java.awt.Graphics;
import java.util.Iterator;
import java.util.Vector;
import java.util.Observer;
import java.util.Observable;

public abstract class Chip extends IrudiAdapter implements Runnable {
	protected int x;

	protected int y;

	private int hankaKopMax = 25;
	private int sarreraKopMax = 21;

	private Vector<Loturak> loturaBek = new Vector<Loturak>();

	protected Integer balioak[] = new Integer[hankaKopMax];

	private boolean balioZuzenak[];

	protected Hanka lotList[] = new Hanka[hankaKopMax];

	public Chip(int x1, int y1, int hankaKop, int sarreraKop) {

		x = x1;
		y = y1;

		hankaKopMax = hankaKop;
		sarreraKopMax = sarreraKop;
		balioZuzenak = new boolean[hankaKopMax];
		balioak = new Integer[hankaKop];
		for (int i = 0; i < this.hankaKopMax; i++) {
			balioZuzenak[i] = false;
			balioak[i] = 0;
			// lotList[i]=new Hanka(x, y, null,null, i,this);
		}
		
	}

	// Hankan bektorea aztertu false den bitartean aktibazioaren zai gelditzen
	// da
	// (barneko while-a hurrengo posizioa ez esnatzeko balio du)
	public void hasieratu() {
		for (int i = 0; i < this.hankaKopMax; i++) {
			balioZuzenak[i] = false;
		}
		for (int j = 0; j < this.sarreraKopMax; j++) {
		if ((this.getLoturenLista()[j].getloturaDu() == false)) {
			System.out.println("SarreraDatu 0ren balioa"
					+ this.getLoturenLista()[j].getSarrera().getBalioa());
			this.balioZuzenak[j] = true;
			System.out.println("Balioak 0ren balioa" + balioak[j]);
		}

		}
	}
public void run(){
	try {
		this.exekutatu();
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}
	public synchronized void exekutatu() throws InterruptedException {

		int i = 0;
		while (i < sarreraKopMax) {

			if (balioZuzenak[i] == false) {
				wait();
			System.out.println(	"jdlsf");
			} else {
				i++;
			}

		}
		this.funtzioLogikoa();
		//Irteera guztiak erakusteko exekutatu da=true izango da irteerako
		//hanka guztietan,denak hartzen ditu, kendu sarrerako ankak
		
		for(int t=0;t<balioZuzenak.length;t++)
			{
			if(lotList[t].getHankaMota()=="i")
			{balioZuzenak[t] = true;
		this.lotList[t].setExekutatuDa(true);}
		this.abixatu();}
//		if (balioZuzenak.length==3)
//		{
//			balioZuzenak[2] = true;
//		this.abixatu();
//		
//		this.lotList[2].setExekutatuDa(true);
//		}
//		else
//		{
//			balioZuzenak[1] = true;
//		this.abixatu();
//		this.lotList[1].setExekutatuDa(true);
//		}
	}

	// Programa exekutatzen denean, lotura bektoreko elementu bakoitza
	// lortzen du eta uneko chip-aren uneko hanka aktibatzen du.

	public synchronized void abixatu() {
		int i = 0;
		// Nota:Probatu abixatu eta exekutatu And-ean egiten, horrela txip
		// bakoitza
		// berea izango du eta chip-ean hankak sortzen direnez ez da problemarik
		// egon behar
		while (lotList.length > i) {
			int j = 0;

			if (lotList[i] != null)
				if (lotList[i].getHankaMota() != "s")

					while (lotList[i].getLotLista().size() > j) {

						// irteera truen jarri
						Chip unekoChip = this.lotList[i].getLotLista().get(j)
								.getChipa();
						// abixatu behar den txipa unekochipean gorde
						int unekoHanka = lotList[i].getLotLista().get(j)
								.getHankaZenb();
						if ((unekoChip.getLoturenLista()[unekoHanka]
								.getloturaDu() == true))
//							if (balioZuzenak.length==3)
							unekoChip.lotList[unekoHanka]
									.getSarrera()
									.setBalioa(
											lotList[i].getIrteera().getBalioa());
//							else
//								unekoChip.lotList[unekoHanka]
//													.getSarrera()
//													.setBalioa(
//															lotList[1].getIrteera().getBalioa());
						unekoChip.aktibatu(unekoHanka);
						// Hau aldatu beharko da, bakarrik ate logikoentzako
						// balio baitu
						j++;
					}
			i++;

		}
		notifyAll();
	}

	public synchronized void aktibatu(int a) {
		this.balioZuzenak[a] = true;
		notifyAll();
	}

	// Irteerako hanka batek izan ditzakeen sarrera hanka guztien loturak
	public void gehituLotura(Loturak l, int indizea) {
		lotList[indizea].loturaGehitu(l);
	}

	public void ezabatuLotura(Loturak l, int indizea) {
		lotList[indizea].loturaEzabatu();
	}

	public Hanka[] getLoturenLista() {
		return lotList;
	}

	// public int getHankaIdent()

	public void setBalioa(int pos, Integer bal) {
		balioak[pos] = bal;

	}

	public boolean[] getBalioZuzenak() {
		return balioZuzenak;

	}

	public Integer[] getHankaBalioak() {
		return balioak;
	}

	protected abstract void funtzioLogikoa(Integer... values);

	public abstract Vector<Hanka> getHankak();

	public abstract Vector<Hanka> getSarreraHankak();

	public abstract Hanka getIrteeraHanka();
	public  Vector<Hanka> getIrteeraHankak(){
		int i;
		Vector<Hanka> irteeraHankak=new Vector<Hanka>();
		for (i=0; i<=hankaKopMax;i++)
			if(lotList[i]!=null)
			if(lotList[i].getHankaMota()=="i")
				irteeraHankak.add(lotList[i]);
		return irteeraHankak;
	}

	
	
	
	// public abstract void borratuHanka(Hanka h);
}
